#ifndef MIDI_H
#define MIDI_H

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>

#define MIDI_ERR_NONE 0
#define MIDI_ERR_SEQ_OPEN 1
#define MIDI_ERR_SEQ_SET_CLIENT_NAME 2
#define MIDI_ERR_SEQ_CREATE_INPUT_PORT 3
#define MIDI_ERR_SEQ_CREATE_OUTPUT_PORT 4
#define MIDI_ERR_SEQ_POLL_DESCRIPTORS_COUNT 5
#define MIDI_ERR_SEQ_POLL_DESCRIPTORS 6

/**
 * Structure d'exception (erreurs) midi
 */
struct midi_exception {
	/**
	 * Le code de l'erreur
	 * @var unsigned int
	 */
	unsigned int code;
	/**
	 * La valeur de l'erreur
	 * @var int
	 */
	int val;
	/**
	 * Le message associé à l'erreur
	 * @var char*
	 */
	char* msg;
};
typedef struct midi_exception midi_exception;


/**
 * Initialise le sequenceur MIDI
 * @param char* hw_name Le nom ALSA du périphérique utilisé
 * @param char* cli_name Le nom donné à l'application cliente
 * @return midi_exception* NULL si aucune erreur, sinon l'erreur
 */
midi_exception *midi_initialize(char *hw_name, char *cli_name);
/**
 * Définie un port de sortie pour un port d'entrée donné
 * @param unsigned char input_channel Le port d'entrée
 * @param char output_channel Le port de sortie. Si valeur négative, sortie OMNI (tous les ports)
 * @return unsigned char La modification a bien été effectuée
 */
unsigned char set_output_channel(unsigned char input_channel, char output_channel);
/**
 * Retourne le port de sortie d'un port d'entrée donné
 * @param unsigned char input_channel Le port d'entrée
 * @return char Le port de sortie associé. -1 pour OMNI. -2 pour erreur
 */
unsigned char get_output_channel(unsigned char input_channel);
/**
 * Liste des périphérques MIDI de sortie
 * @return char** La liste des périphériques MIDI de sortie
 */
char **get_midi_output_hw();
/**
 * Liste des pérphériques MIDI d'entrée
 * @return char** La liste des périphériques MIDI d'entrée
 */
char **get_midi_input_hw();

#endif
